// 下述代码中，LNode类型已经定义，具体细节请查看 main.h 文件。

#include "main.h"

typedef struct delete delete;

int ListInitiate(LNode **head)
{
	*head = (LNode*) malloc(sizeof(LNode));
	if(!*head){
		return 1;
	}
	(*head)->next = NULL;
	return 0;
}

int ListLength(LNode *head) 
	{
	LNode *p;
	p=head->next;
	int i=0;
	while(p){
		i++;
		p=p->next;
	}
	return i;
}

int ListInsert(LNode *head, int i, DataType x) {
	LNode *p=head,*s;int j=-1;
	while(p&&j<i-1){p=p->next;++j;}
	if(!p||j>i) return 1;
	s= (LNode*) malloc(sizeof(LNode));
	s->data = x;
	
	s->next=p->next;
	p->next=s;
	
	return 0;
}

int ListDelete(LNode *head, int i, DataType *x) {
	LNode *p=head;int j=-1;
	while(p->next&&j<i-1){
		p=p->next;++j;
	}
	if(!(p->next)||j>i-1) return 1;
	LNode *q=p->next;
	p->next=q->next;
	*x=q->data;
	free(q);
	return 0;
}

int ListGet(LNode *head, int i, DataType *x) {
	LNode *p;
	p=head->next;int j=0;
	while(p&&j<i){
		p=p->next;++j;
	}
	if(!p||j>i) return 1;
	*x=p->data;
	return 0;
}

int Destroy(LNode **head)
{
	LNode *p,*r;
	p=*head;
	while(p!=NULL)
	{
		r=p;
		p=p->next;
		free(r);
	}
	*head=NULL;
	return 0;
}


void main(void)
{
	LNode *head;
	int i , x;
	ListInitiate(&head);/*初始化*/
	for(i = 0; i < 10; i++)
	{
		if(ListInsert(head, i, i+1) == 1) /*插入10个数据元素*/
		{
			printf("错误1! \n");
			return;
		}
	}
	
	if(ListDelete(head, 4, &x) == 1) /*删除数据元素5*/
	{
		printf("错误2! \n");
		return;
	}
	
	for(i = 0; i < ListLength(head); i++)
	{
		if(ListGet(head, i, &x) == 1) /*取元素*/
		{
			printf("错误3! \n");
			return;
		}
		else printf("%d    ", x);/*显示数据元素*/
	}
	
	Destroy(&head);
}
